﻿using Be.Timvw.Framework.ComponentModel;
using CristoRessuscitado.BancoDados;
using CristoRessuscitado.Utils;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Resources;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace CristoRessuscitado.Formularios
{
    public partial class FormConsultaPessoas : Form, IFormConsultaPadrao
    {
        private const   int                 CB_SEXO_INDEX_AMBOS         = 0;
        private const   int                 CB_SEXO_INDEX_MASCULINO     = 1;
        private const   int                 CB_SEXO_INDEX_FEMININO      = 2;

        private         DatabaseContext     dbContext;
        private         int                 idRegistroSelecionado;

        public bool     SelecionarEsposo                               { get; set; } 
        public bool     SelecionarEsposa                               { get; set; }
        public bool     SelecionarPessoa                               { get; set; }

        public FormConsultaPessoas()
        {
            InitializeComponent();
        }

        // ---------------------------------------------------------------------------------------------------------------------------
        //
        // Eventos
        //
        // ---------------------------------------------------------------------------------------------------------------------------

        private void FormConsultaPessoas_Load(object sender, EventArgs e)
        {
            Inicializar();
        }

        private void FormConsultaPessoas_KeyDown(object sender, KeyEventArgs e)
        {
            OnTecladoKeyDown(e);
        }

        private void txtNome_TextChanged(object sender, EventArgs e)
        {
            Atualizar();
        }

        private void cbSexo_SelectedIndexChanged(object sender, EventArgs e)
        {
            Atualizar();
        }

        private void dgv_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            // Recupera o id pelo índice na grid
            try
            {
                idRegistroSelecionado = Convert.ToInt32(dgv.Rows[e.RowIndex].Cells[0].Value);
            }
            catch (Exception)
            {
                idRegistroSelecionado = -1;
            }
        }

        private void dgv_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            if (idRegistroSelecionado != -1)
            {
                if (SelecionarEsposo || SelecionarEsposa)
                {
                    AssociarConjugeFormCadCasal();
                    this.Close();
                }
                else
                { 
                     AbrirFormularioParaAlteracaoRegistro();
                }
            }
            else
            {
                GeralUtils.ExibirDialogMsgValidacao(this, MensagensPadrao.txt_geral_selecione_registro_alterar);
            }
        }

        private void dgv_Sorted(object sender, EventArgs e)
        {
            LimparSelecaoRegistro();
        }

        private void btnSelecionarPessoa_Click(object sender, EventArgs e)
        {
            if (idRegistroSelecionado != -1)
            {
                AssociarConjugeFormCadCasal();
                this.Close();
            }
            else
            {
                GeralUtils.ExibirDialogMsgValidacao(this, "Selecione um registro para associar como cônjuge.");
            }
        }

        private void btnIncluir_Click(object sender, EventArgs e)
        {
            AbrirFormularioParaNovoRegistro();
        }

        private void btnAlterar_Click(object sender, EventArgs e)
        {
            if (idRegistroSelecionado != -1)
            {
                AbrirFormularioParaAlteracaoRegistro();
            }
            else
            {
                GeralUtils.ExibirDialogMsgValidacao(this, MensagensPadrao.txt_geral_selecione_registro_alterar);
            }
        }

        private void btnExcluir_Click(object sender, EventArgs e)
        {
            if (idRegistroSelecionado != -1)
            {
                if (ValidarExcluirRegistroSelecionado())
                {
                    ExcluirRegistroSelecionado();
                    Atualizar();
                }
            }
            else
            {
                GeralUtils.ExibirDialogMsgValidacao(this, MensagensPadrao.txt_geral_selecione_registro_excluir);
            }
        }

        // ---------------------------------------------------------------------------------------------------------------------------
        //                                                                                                                           
        // Métodos Auxiliares                                                                                                        
        //                                                                                                                           
        // ---------------------------------------------------------------------------------------------------------------------------

        public void OnTecladoKeyDown(KeyEventArgs e)
        {
            if (e.KeyCode == (Keys.Escape))
            {
                Close();
            }
        }

        public void Inicializar()
        {
            dbContext = new DatabaseContext();
            KeyPreview = true;
            btnSelecionarPessoa.Visible = false;

            if (SelecionarEsposo || SelecionarEsposa || SelecionarPessoa)
                btnSelecionarPessoa.Visible = true;

            ConfigurarComboBoxSexo();

            Atualizar();
        }

        public void Atualizar()
        {
            // Filtro
            string filtroNome = tbFiltroNomePessoa.Text.Trim();

            string filtroSexo = null;
            switch (cbSexo.SelectedIndex)
            {
                case CB_SEXO_INDEX_AMBOS:
                    filtroSexo = "A";
                    break;
                case CB_SEXO_INDEX_MASCULINO:
                    filtroSexo = "M";
                    break;
                case CB_SEXO_INDEX_FEMININO:
                    filtroSexo = "F";
                    break;
                default:
                    break;
            }

            // Alimenta a Grid
            var lista = dbContext.Pessoa.AsNoTracking().ToList();

            lista = lista.Where(e => e.NomeCompleto.StartsWith(filtroNome, StringComparison.InvariantCultureIgnoreCase)).ToList();

            if (filtroSexo != null && !filtroSexo.Equals("A"))
            {
                lista = lista.Where(e => e.Sexo.Equals(filtroSexo)).ToList();
            }

            var listaProjetada = from e in lista
                                 select
                                    new
                                    {
                                        Id = e.IdPessoa,
                                        Nome = e.NomeCompleto,
                                        Sexo = e.Sexo.Equals("M") ? "Masculino" : "Feminino",
                                        TelResidencial = GeralUtils.FormatarStringTelefone(e.TelefoneResidencial),
                                        TelCelular = GeralUtils.FormatarStringTelefone(e.TelefoneCelular),
                                        Email = e.Email
                                    };

            var listaOrdenavel = new SortableBindingList<Object>(listaProjetada);

            dgv.DataSource = listaOrdenavel;

            lblTotalRegistros.Text = MensagensPadrao.lbl_geral_total_registros + listaOrdenavel.Count;

            // Configura a grid
            GeralUtils.AplicarFormatacaoPadraoDGV(dgv);
            if (dgv.Rows.Count > 0)
            {
                dgv.Columns[0].Visible = false;
                dgv.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
                dgv.Columns[1].HeaderText = "Nome";
                dgv.Columns[2].HeaderText = "Sexo";
                dgv.Columns[2].Width = 80;
                dgv.Columns[3].HeaderText = "Tel. Residencial";
                dgv.Columns[3].Width = 115;
                dgv.Columns[4].HeaderText = "Tel. Celular";
                dgv.Columns[4].Width = 120;
                dgv.Columns[5].HeaderText = "E-mail";
                dgv.Columns[5].Width = 185;
            }

            LimparSelecaoRegistro();
        }

        public void ConfigurarComboBoxSexo()
        {
            cbSexo.Items.Insert(CB_SEXO_INDEX_AMBOS, "Ambos");
            cbSexo.Items.Insert(CB_SEXO_INDEX_MASCULINO, "Masculino");
            cbSexo.Items.Insert(CB_SEXO_INDEX_FEMININO, "Feminino");
            
            if (SelecionarEsposo)
            {
                cbSexo.SelectedIndex = CB_SEXO_INDEX_MASCULINO;
                cbSexo.Enabled = false;
            }
            else if (SelecionarEsposa)
            {
                cbSexo.SelectedIndex = CB_SEXO_INDEX_FEMININO;
                cbSexo.Enabled = false;
            }
            else
            {
                cbSexo.SelectedIndex = CB_SEXO_INDEX_AMBOS;
            }
        }

        public void AbrirFormularioParaNovoRegistro()
        {
            FormCadPessoa form = new FormCadPessoa();
            form.ShowDialog(this);
            Atualizar();
        }

        public void AbrirFormularioParaAlteracaoRegistro()
        {
            FormCadPessoa form = new FormCadPessoa();
            form.FlagAlteracao = true;
            form.IdRegistro = idRegistroSelecionado;
            form.ShowDialog(this);
            Atualizar();
        }

        public void ExcluirRegistroSelecionado()
        {
            dbContext.Database.ExecuteSqlCommand("delete from PessoaFuncao where IdPessoa = " + idRegistroSelecionado);
            dbContext.Database.ExecuteSqlCommand("delete from Pessoa where IdPessoa = " + idRegistroSelecionado);
            dbContext.SaveChanges();
        }

        public void LimparSelecaoRegistro()
        {
            dgv.ClearSelection();
            idRegistroSelecionado = -1;
        }

        private void AssociarConjugeFormCadCasal()
        {
            FormCadCasal form = FormCadCasal.GetInstance();

            if (SelecionarEsposo)
            {
                form.IdEsposo = idRegistroSelecionado;
            }
            else if (SelecionarEsposa)
            {
                form.IdEsposa = idRegistroSelecionado;
            }
        }

        public bool ValidarExcluirRegistroSelecionado()
        {
            bool relacaoCasal = dbContext.Casal.Any(p => p.IdPessoaEsposo == idRegistroSelecionado || p.IdPessoaEsposa == idRegistroSelecionado);
            if (relacaoCasal)
            {
                GeralUtils.ExibirDialogMsgValidacao(this, "Não é possível excluir o registro selecionado. O registro está vinculado ao Cadastro de Casais.");
                return false;
            }

            return true;
        }
    }
}
